In [1]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Hofstadter's butterfly

Douglas R. Hofstadter: Energy levels and wave functions of Bloch electrons in rational and irrational magnetic fields, Phys. Rev. B 14, 2239 (1976). see here

In [2]:
dim=100
phiran=linspace(0,2*pi,500)
kran=linspace(-pi,pi,100)
Eran=linspace(-4,4,300)
H0=-diag(ones(dim-1),1)-diag(ones(dim-1),-1)
DAT=[]
for phi in (phiran):
    H1=-diag([exp(1j*i*phi) for i in linspace(-dim/2,dim/2,dim)])
    dat=[]
    for k in kran:
        dat.append(eigvalsh(H0+H1*exp(1j*k)+conj(H1.T)*exp(-1j*k)))
    dat=array(dat).flatten()
    hst,dummy=histogram(dat,Eran,normed=True)
    DAT.append(hst)
    #DAT.append(dat)
In [3]:
pcolormesh(phiran,Eran,array(DAT).T,cmap='Greys');
title('Hofstadter spectrum',fontsize=15)
xlabel(r'$\phi/\phi_0$',fontsize=20)
ylabel(r'$E$',fontsize=20);
In [ ]: